package com.wh.wisdomsite.xbox.common;

import com.wh.wisdomsite.xbox.common.annotation.MessageFormat;
import com.wh.wisdomsite.xbox.common.error.MainError;
import com.wh.wisdomsite.xbox.common.annotation.HttpAction;
import com.wh.wisdomsite.xbox.common.session.Session;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
import java.util.Map;

/**
 * 声明XboxRequestContext请求接口
 * @Package com.wh.wisdomsite.xbox.common
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public interface XboxRequestContext {


    String SPRING_VALIDATE_ERROR_ATTRNAME = "$SPRING_VALIDATE_ERROR_ATTRNAME";

    /**
     * 是否正常运行结束
     * @return
     */
    boolean isSuccess();

    /**
     * 获取Exception
     * @return
     */
    String getException();


    /**
     * 设置Exception
     * @return
     */
    String setException(Exception exception);

    /**
     * 获取Throwable
     * @return
     */
    Throwable getThrowable();

    /**
     * 设置Throwable
     * @param throwable
     */
    void setThrowable(Throwable throwable);


    /**
     * 获取logicError
     * @return
     */
    StringBuffer getLogicError();

    /**
     * 设置logicError
     * @param logicError
     */
    void setLogicError(StringBuffer logicError);

    /**
     * 获取系统Session
     * @return
     */
    Session getSession();

    /**
     * 添加系统Session
     * @param sessionId 会话标识
     * @param session   会话对象
     */
    void addSession(String sessionId, Session session);

    /**
     * 添加系统Session
     * @param sessionId   会话标识
     * @param session     会话对象
     * @param expiredTime 失效时间
     */
    void addSession(String sessionId, Session session, int expiredTime);

    /**
     * 添加系统Session
     * @param sessionId   会话标识
     * @param session     会话对象
     * @param expiredTime 失效时间
     * @param attrKey     session中存储的key值
     */
    void addSession(String sessionId, Session session, int expiredTime, String attrKey);


    /**
     * 删除系统Session
     */
    void removeSession();

    /**
     * 获取Session标识
     * @return
     */
    String getSessionId();


    /**
     * 获取其他Session
     * @param sessionId  会话标识
     * @return
     */
    Session getOtherSession(String sessionId);

    /**
     * 添加其他Session
     * @param sessionId   会话标识
     * @param session     会话对象
     * @param expiredTime 失效时间
     */
    void addOtherSession(String sessionId, Session session, int expiredTime);


    /**
     * 删除指定会话
     * @param sessionId   会话标识
     */
    void removeOtherSesssion(String sessionId);


    /**
     * 设置Session标识
     * @param sessionId
     */
    void setSessionId(String sessionId);


    /**
     * 是否开启签名
     * @return
     */
    boolean isSignEnable();

    /**
     * 获取MethodKey
     * @return
     */
    String getMethodKey();

    /**
     * 获取BindObject
     * @return
     */
    String getBindObject();

    /**
     * 设置bindObject
     * @param bindObject
     */
    void setBindObject(String bindObject);

    /**
     * 获取Sign
     * @return
     */
    String getSign();

    /**
     * 设置Sign
     * @param sign
     */
    void setSign(String sign);

    /**
     * 获取消息格式
     * @return
     */
    MessageFormat getMessageFormat();

    /**
     * 设置消息格式
     * @param messageFormat
     */
    void setMessageFormat(MessageFormat messageFormat);


    /**
     * 获取AppKey
     * @return
     */
    String getAppKey();

    /**
     * 设置AppKey
     * @param appKey
     */
    void setAppKey(String appKey);

    /**
     * 获取Ip
     * @return
     */
    String getIp();

    /**
     * 设置Ip
     * @param ip
     */
    void setIp(String ip);

    /**
     * 获取参数集
     * @return
     */
    Map<String, String> getAllParams();

    /**
     * 设置参数集
     * @param allParams
     */
    void setAllParams(Map<String, String> allParams);


    /**
     * 获取XboxResponse
     * @return
     */
    Object getXboxResponse();

    /**
     * 设置XboxResponse
     * @param xboxResponse
     */
    void setXboxResponse(Object xboxResponse);


    /**
     * 设置调用方式[SYNC, ASYNC]
     * @param executionType
     * @return
     */
    void setExecutionType(String executionType);

    /**
     * 获取调用方式[SYNC, ASYNC]
     * @return
     */
    String getExecutionType();

    /**
     * 获取请求方式[POST, GET]
     * @return
     */
    HttpAction getHttpAction();

    /**
     * 设置请求方式[POST, GET]
     * @param httpAction
     */
    void setHttpAction(HttpAction httpAction);

    /**
     * 获取Locale
     * @return
     */
    Locale getLocale();

    /**
     * 设置Locale
     * @param locale
     */
    void setLocale(Locale locale);

    /**
     * 获取Attribute
     * @param name
     * @return
     */
    Object getAttribute(String name);

    /**
     * 设置Attribute
     * @param name
     * @param object
     */
    void setAttribute(String name, Object object);

    /**
     * 获取HttpServletRequest
     * @return
     */
    HttpServletRequest getServletRequest();

    /**
     * 设置HttpServletRequest
     * @param servletRequest
     */
    void setServletRequest(HttpServletRequest servletRequest);

    /**
     * 获取HttpServletResponse
     * @return
     */
    HttpServletResponse getServletResponse();

    /**
     * 设置HttpServletResponse
     * @param servletResponse
     * @return
     */
    void setServletResponse(HttpServletResponse servletResponse);

    /**
     * 获取XboxRequest
     * @return
     */
    XboxRequest getXboxRequest();

    /**
     * 设置XboxRequest
     * @param xboxRequest
     */
    void setXboxRequest(XboxRequest xboxRequest);

    /**
     * 获取XboxContext
     * @return
     */
    XboxContext getXboxContext();

    /**
     * 设置XboxContext
     * @param xboxContext
     */
    void setXboxContext(XboxContext xboxContext);

    /**
     * 获取ServiceMethodHandler
     * @return
     */
    ServiceMethodHandler getServiceMethodHandler();

    /**
     * 设置ServiceMethodHandler
     * @param serviceMethodHandler
     */
    void setServiceMethodHandler(ServiceMethodHandler serviceMethodHandler);

    /**
     * 获取方法
     * @return
     */
    String getMethod();

    /**
     * 设置方法
     * @param method
     */
    void setMethod(String method);

    /**
     * 获取Format
     * @return
     */
    String getFormat();

    /**
     * 设置Format
     * @param format
     */
    void setFormat(String format);

    /**
     * 获取Version
     * @return
     */
    String getVersion();

    /**
     * 设置Version
     * @param version
     */
    void setVersion(String version);

    /**
     * 获取MainError
     * @return
     */
    MainError getMainError();

    /**
     * 设置MainError
     * @param mainError
     */
    void setMainError(MainError mainError);

    /**
     * 获取开始时间
     * @return
     */
    long getBeginTime();

    /**
     * 设置开始时间
     * @param beginTime
     */
    void setBeginTime(long beginTime);

    /**
     * 获取结束时间
     * @return
     */
    long getEndTime();

    /**
     * 设置结束时间
     * @param endTime
     */
    void setEndTime(long endTime);

    /**
     * 获取持续时间
     * @return
     */
    long getDuration();

    /**
     * 获取响应
     * @return
     */
    String getOutPut();

    /**
     * 设置响应
     * @param outPut
     */
    void setOutPut(String outPut);

    /**
     * 获取时间戳
     * @return
     */
    Long getRequestTimestamp();

    /**
     * 设置时间戳
     * @param requestTimestamp
     */
    void setRequestTimestamp(Long requestTimestamp);



    /**
     * 调用类型(ANDROID, IOS, HTML5)
     */
    String getCallType();


    /**
     * 设置调用类型(ANDROID, IOS, HTML5)
     */
    void setCallType(String callType);


    /**
     * 调用版本
     * @return
     */
    String getCallVersion();


    /**
     * 设置调用版本
     * @param callVersion
     */
    void setCallVersion(String callVersion);


    /**
     * 获取Client
     * @return
     */
    String getClient();


    /**
     * 设置Client
     * @param client
     */
    void setClient(String client);


    /**
     * 获取应用品牌
     * @return
     */
    String getAppBrand();


    /**
     * 设置应用品牌
     * @param appBrand
     */
    void setAppBrand(String appBrand);


    /**
     * 获取应用信息
     * @return
     */
    String getAppBaseInfo();


    /**
     * 设置应用信息
     * @param appBaseInfo
     */
    void setAppBaseInfo(String appBaseInfo);

}
